package com.bank.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.entity.CustomerCardView;
import com.bank.entity.TradeDetailView;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 视图查询数据访问层接口
 * 提供对数据库视图的查询操作
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
@Mapper
public interface ViewMapper {

    // ================================
    // 客户银行卡视图查询
    // ================================

    /**
     * 查询所有客户银行卡视图数据
     * 
     * @return 客户银行卡视图列表
     */
    List<CustomerCardView> selectAllCustomerCards();

    /**
     * 分页查询客户银行卡视图数据
     * 
     * @param page 分页参数
     * @param customerName 客户姓名（可选，模糊查询）
     * @param savingName 存款类型（可选，模糊查询）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return 分页结果
     */
    IPage<CustomerCardView> selectCustomerCardsPage(Page<CustomerCardView> page,
                                                   @Param("customerName") String customerName,
                                                   @Param("savingName") String savingName,
                                                   @Param("isReportLoss") String isReportLoss,
                                                   @Param("startDate") LocalDate startDate,
                                                   @Param("endDate") LocalDate endDate,
                                                   @Param("minBalance") BigDecimal minBalance,
                                                   @Param("maxBalance") BigDecimal maxBalance);

    /**
     * 根据客户姓名查询客户银行卡视图
     * 
     * @param customerName 客户姓名
     * @return 客户银行卡视图列表
     */
    List<CustomerCardView> selectCustomerCardsByName(@Param("customerName") String customerName);

    /**
     * 根据存款类型查询客户银行卡视图
     * 
     * @param savingName 存款类型
     * @return 客户银行卡视图列表
     */
    List<CustomerCardView> selectCustomerCardsBySavingType(@Param("savingName") String savingName);

    // ================================
    // 交易明细视图查询
    // ================================

    /**
     * 查询所有交易明细视图数据
     * 
     * @return 交易明细视图列表
     */
    List<TradeDetailView> selectAllTradeDetails();

    /**
     * 分页查询交易明细视图数据
     * 
     * @param page 分页参数
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return 分页结果
     */
    IPage<TradeDetailView> selectTradeDetailsPage(Page<TradeDetailView> page,
                                                 @Param("cardId") String cardId,
                                                 @Param("customerName") String customerName,
                                                 @Param("tradeType") String tradeType,
                                                 @Param("startTime") LocalDateTime startTime,
                                                 @Param("endTime") LocalDateTime endTime,
                                                 @Param("minAmount") BigDecimal minAmount,
                                                 @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 根据卡号查询交易明细视图
     * 
     * @param cardId 卡号
     * @return 交易明细视图列表
     */
    List<TradeDetailView> selectTradeDetailsByCardId(@Param("cardId") String cardId);

    /**
     * 根据客户姓名查询交易明细视图
     * 
     * @param customerName 客户姓名
     * @return 交易明细视图列表
     */
    List<TradeDetailView> selectTradeDetailsByCustomerName(@Param("customerName") String customerName);

    /**
     * 根据交易类型查询交易明细视图
     * 
     * @param tradeType 交易类型
     * @return 交易明细视图列表
     */
    List<TradeDetailView> selectTradeDetailsByType(@Param("tradeType") String tradeType);
}
